package com.lcu.wl.modules.sys.controller;


import com.lcu.wl.annotation.Log;
import com.lcu.wl.common.utils.Constant;
import com.lcu.wl.common.utils.PageUtils;
import com.lcu.wl.common.utils.SYSDATA;
import com.lcu.wl.common.validator.ValidatorUtils;
import com.lcu.wl.modules.sys.entity.Role;
import com.lcu.wl.modules.sys.service.IRoleMenuService;
import com.lcu.wl.modules.sys.service.IRoleService;
import io.swagger.annotations.ApiOperation;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.*;
import java.util.stream.Collectors;

/**
 * <p>
 * 角色管理 前端控制器
 * </p>
 *
 * @author wanglei
 * @since 2021-01-15
 */
@RestController
@RequestMapping("/sys/role")
public class RoleController extends AbstractController{
    @Autowired
    private IRoleService iRoleService;
    @Autowired
    private IRoleMenuService iRoleMenuService;

    /**
     * 下拉框 角色列表
     */
    @GetMapping("/select")
    @RequiresPermissions("sys:role:select")
    public SYSDATA select(){
        Map<String,Object> map = new HashMap<>();
        //如果不是超级管理员，则只查询自己所拥有的角色列表
        if(getUserId() != Constant.SUPER_ADMIN){
            map.put("create_user_id",getUserId());
        }
        List<Role> list = iRoleService.listByMap(map);
        return SYSDATA.ok().put("list",list);
    }

    /**
     * 角色列表
     */
    @GetMapping("/list")
    @ApiOperation("角色查询")
    @RequiresPermissions("sys:role:list")
    public SYSDATA list(@RequestParam Map<String, Object> params){
        //如果不是超级管理员，则只查询自己创建的角色列表
        if(getUserId() != Constant.SUPER_ADMIN){
            params.put("createUserId", getUserId());
        }

        PageUtils page = iRoleService.queryPage(params);
        List<Role> list = (List<Role>) page.getList();
        //得到角色Id
        List<Long> roleIds = list.stream().map(Role::getRoleId).collect(Collectors.toList());
        for (int i = 0; i < roleIds.size(); i++) {
            //根据角色Id查询得到该角色拥有的菜单
            List<Long> menuIds = iRoleMenuService.getMenuIds(roleIds.get(i));
            list.get(i).setMenuIds(menuIds);
        }
        page.setList(list);

        return SYSDATA.ok().put("page", page);
    }

    /**
     * 保存角色
     */
    @Log("新增角色信息")
    @ApiOperation("新增角色")
    @PostMapping("/save")
    @RequiresPermissions("sys:role:save")
    public SYSDATA save(@RequestBody Role role){
        ValidatorUtils.validateEntity(role);
        role.setCreateUserId(getUserId());
        iRoleService.saveRole(role);
        return SYSDATA.ok();
    }
    /**
     * 角色信息
     */
    @GetMapping("/info/{roleId}")
    @ApiOperation("根据ID获取角色信息")
    @RequiresPermissions(("sys:role:info"))
    public SYSDATA info(@PathVariable("roleId") Long roleId){
        Role role = iRoleService.getById(roleId);
        return SYSDATA.ok().put("role",role);
    }

    /**
     * 修改角色
     */
    @Log("修改角色信息")
    @ApiOperation("修改角色")
    @PostMapping("update")
    @RequiresPermissions("sys:role:update")
    public SYSDATA update(@RequestBody Role role){
        ValidatorUtils.validateEntity(role);
        role.setCreateUserId(getUserId());
        iRoleService.updateById(role);
        return SYSDATA.ok();
    }

    /**
     * 删除角色
     */
    @Log("删除角色信息")
    @ApiOperation("删除角色")
    @PostMapping("/delete")
    @RequiresPermissions("sys:role:delete")
    public SYSDATA delete(@RequestBody Long[] roleIds){
        iRoleService.deleteBatch(roleIds);
        return SYSDATA.ok();
    }

    /**
     * 保存角色菜单关系
     * @param resources
     * @return
     */
    @Log("保存角色菜单信息")
    @ApiOperation("角色菜单授权")
    @PutMapping("/menu")
    @RequiresPermissions("role:menu:update")
    public SYSDATA updateRoleMenu(@RequestBody Role resources){
        iRoleMenuService.updateRoleMenu(resources);
        return SYSDATA.ok();
    }
}
